/*
     File:       GXTypes.h
 
     Contains:   QuickDraw GX object and constant definitions
 
     Version:    Technology: Quickdraw GX 1.1
                 Release:    QuickTime 7.3
 
     Copyright:  (c) 2007 (c) 1994-1999 by Apple Computer, Inc., all rights reserved.
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __GXTYPES__
#define __GXTYPES__

#ifndef __MACTYPES__
#include "MacTypes.h"
#endif

#ifndef __MIXEDMODE__
#include "MixedMode.h"
#endif

#ifndef __FIXMATH__
#include "FixMath.h"
#endif

#ifndef __GXMATH__
#include "GXMath.h"
#endif

#ifndef __IMAGECODEC__
#include "ImageCodec.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif



typedef struct OpaquegxShape*           gxShape;
typedef struct OpaquegxStyle*           gxStyle;
typedef struct OpaquegxInk*             gxInk;
typedef struct OpaquegxTransform*       gxTransform;
typedef struct OpaquegxTag*             gxTag;
typedef struct OpaquegxColorSet*        gxColorSet;
typedef struct OpaquegxColorProfile*    gxColorProfile;
typedef struct OpaquegxGraphicsClient*  gxGraphicsClient;
typedef struct OpaquegxViewGroup*       gxViewGroup;
typedef struct OpaquegxViewPort*        gxViewPort;
typedef struct OpaquegxViewDevice*      gxViewDevice;

typedef long                            gxColorSpace;
/* gxShape enumerations */
enum {
  gxEmptyType                   = 1,
  gxPointType                   = 2,
  gxLineType                    = 3,
  gxCurveType                   = 4,
  gxRectangleType               = 5,
  gxPolygonType                 = 6,
  gxPathType                    = 7,
  gxBitmapType                  = 8,
  gxTextType                    = 9,
  gxGlyphType                   = 10,
  gxLayoutType                  = 11,
  gxFullType                    = 12,
  gxPictureType                 = 13
};

typedef long                            gxShapeType;
enum {
  gxNoFill                      = 0,
  gxOpenFrameFill               = 1,
  gxFrameFill                   = gxOpenFrameFill,
  gxClosedFrameFill             = 2,
  gxHollowFill                  = gxClosedFrameFill,
  gxEvenOddFill                 = 3,
  gxSolidFill                   = gxEvenOddFill,
  gxWindingFill                 = 4,
  gxInverseEvenOddFill          = 5,
  gxInverseSolidFill            = gxInverseEvenOddFill,
  gxInverseFill                 = gxInverseEvenOddFill,
  gxInverseWindingFill          = 6
};

typedef long                            gxShapeFill;
enum {
  gxNoAttributes                = 0,
  gxDirectShape                 = 0x0001,
  gxRemoteShape                 = 0x0002,
  gxCachedShape                 = 0x0004,
  gxLockedShape                 = 0x0008,
  gxGroupShape                  = 0x0010,
  gxMapTransformShape           = 0x0020,
  gxUniqueItemsShape            = 0x0040,
  gxIgnorePlatformShape         = 0x0080,
  gxNoMetricsGridShape          = 0x0100,
  gxDiskShape                   = 0x0200,
  gxMemoryShape                 = 0x0400
};

typedef long                            gxShapeAttribute;
/* gxShape editing enumerations */
enum {
  gxBreakNeitherEdit            = 0,
  gxBreakLeftEdit               = 0x0001,
  gxBreakRightEdit              = 0x0002,
  gxRemoveDuplicatePointsEdit   = 0x0004
};

/* if the new first (or last) point exactly matches the point before it in */
/* the same contour, then remove it) */
typedef long                            gxEditShapeFlag;
enum {
  gxSelectToEnd                 = -1
};

#define gxSetToNil  (void *)(-1)
#define gxAnyNumber     1
enum {
  gxCounterclockwiseDirection   = 0,
  gxClockwiseDirection          = 1
};

typedef long                            gxContourDirection;
/* gxShape structures */
/* The type 'gxPoint' is defined in "GXMath.h" */
struct gxLine {
  gxPoint             first;
  gxPoint             last;
};
typedef struct gxLine                   gxLine;
struct gxCurve {
  gxPoint             first;
  gxPoint             control;
  gxPoint             last;
};
typedef struct gxCurve                  gxCurve;
struct gxRectangle {
  Fixed               left;
  Fixed               top;
  Fixed               right;
  Fixed               bottom;
};
typedef struct gxRectangle              gxRectangle;
struct gxPolygon {
  long                vectors;
  gxPoint             vector[1];
};
typedef struct gxPolygon                gxPolygon;
struct gxPolygons {
  long                contours;
  gxPolygon           contour[1];
};
typedef struct gxPolygons               gxPolygons;
/* Now defined in ImageCodec.i*/
#if 0
struct gxPath {
  long                vectors;
  long                controlBits[1];
  gxPoint             vector[1];
};
typedef struct gxPath                   gxPath;
struct gxPaths {
  long                contours;
  gxPath              contour[1];
};
typedef struct gxPaths                  gxPaths;
#endif  /* 0 */

struct gxBitmap {
    char            *image;     /* pointer to pixels */
    long            width;      /* width in pixels */
    long            height;     /* height in pixels */
    long            rowBytes;   /* width in bytes */
    long            pixelSize;      /* physical bits per pixel */
    gxColorSpace    space;
    gxColorSet      set;
    gxColorProfile  profile;
};
typedef struct gxBitmap gxBitmap;
struct gxLongRectangle {
  long                left;
  long                top;
  long                right;
  long                bottom;
};
typedef struct gxLongRectangle          gxLongRectangle;
/* gxStyle enumerations */
enum {
  gxCenterFrameStyle            = 0,
  gxSourceGridStyle             = 0x0001,
  gxDeviceGridStyle             = 0x0002,
  gxInsideFrameStyle            = 0x0004,
  gxOutsideFrameStyle           = 0x0008,
  gxAutoInsetStyle              = 0x0010
};


typedef long                            gxStyleAttribute;
enum {
  gxBendDash                    = 0x0001,
  gxBreakDash                   = 0x0002,
  gxClipDash                    = 0x0004,
  gxLevelDash                   = 0x0008,
  gxAutoAdvanceDash             = 0x0010
};

typedef long                            gxDashAttribute;
enum {
  gxPortAlignPattern            = 0x0001,
  gxPortMapPattern              = 0x0002
};

typedef long                            gxPatternAttribute;
enum {
  gxSharpJoin                   = 0x0000,
  gxCurveJoin                   = 0x0001,
  gxLevelJoin                   = 0x0002,
  gxSnapJoin                    = 0x0004
};

typedef long                            gxJoinAttribute;
enum {
  gxLevelStartCap               = 0x0001,
  gxLevelEndCap                 = 0x0002
};

typedef long                            gxCapAttribute;
enum {
  gxAutoAdvanceText             = 0x0001,
  gxNoContourGridText           = 0x0002,
  gxNoMetricsGridText           = 0x0004,
  gxAnchorPointsText            = 0x0008,
  gxVerticalText                = 0x0010,
  gxNoOpticalScaleText          = 0x0020
};

typedef long                            gxTextAttribute;
enum {
  gxLeftJustify                 = 0,
  gxCenterJustify               = fract1 / 2,
  gxRightJustify                = fract1,
  gxFillJustify                 = -1
};

enum {
  gxUnderlineAdvanceLayer       = 0x0001, /* a gxLine is drawn through the advances */
  gxSkipWhiteSpaceLayer         = 0x0002, /* except characters describing white space */
  gxUnderlineIntervalLayer      = 0x0004, /* (+ gxStringLayer) a gxLine is drawn through the gaps between advances */
  gxUnderlineContinuationLayer  = 0x0008, /* (+ gxStringLayer) join this underline with another face */
  gxWhiteLayer                  = 0x0010, /* the layer draws to white instead of black */
  gxClipLayer                   = 0x0020, /* the characters define a clip */
  gxStringLayer                 = 0x0040 /* all characters in run are combined */
};

typedef long                            gxLayerFlag;
/* gxStyle structures */
struct gxFaceLayer {
  gxShapeFill         outlineFill;            /* outline framed or filled */
  gxLayerFlag         flags;                  /* various additional effects */
  gxStyle             outlineStyle;           /* outline */
  gxTransform         outlineTransform;       /* italic, condense, extend */
  gxPoint             boldOutset;             /* bold */
};
typedef struct gxFaceLayer              gxFaceLayer;
struct gxTextFace {
  long                faceLayers;             /* layer to implement shadow */
  gxMapping           advanceMapping;         /* algorithmic change to advance width */
  gxFaceLayer         faceLayer[1];           /* zero or more face layers describing the face */
};
typedef struct gxTextFace               gxTextFace;
struct gxJoinRecord {
  gxJoinAttribute     attributes;
  gxShape             join;
  Fixed               miter;
};
typedef struct gxJoinRecord             gxJoinRecord;
struct gxDashRecord {
  gxDashAttribute     attributes;
  gxShape             dash;                   /* similar to pattern, except rotated to gxLine slope */
  Fixed               advance;                /* specifies repeating frequency of dash */
  Fract               phase;                  /* specifies offset into the gxPath to start dashing */
  Fixed               scale;                  /* specifies height of dash to be mapped to penWidth */
};
typedef struct gxDashRecord             gxDashRecord;
struct gxPatternRecord {
  gxPatternAttribute  attributes;
  gxShape             pattern;
  gxPoint             u;
  gxPoint             v;
};
typedef struct gxPatternRecord          gxPatternRecord;
struct gxCapRecord {
  gxCapAttribute      attributes;
  gxShape             startCap;
  gxShape             endCap;
};
typedef struct gxCapRecord              gxCapRecord;

/* gxInk enumerations */
enum {
  gxPortAlignDitherInk          = 0x0001,
  gxForceDitherInk              = 0x0002,
  gxSuppressDitherInk           = 0x0004,
  gxSuppressHalftoneInk         = 0x0008
};


typedef long                            gxInkAttribute;
enum {
  gxNoMode                      = 0,
  gxCopyMode                    = 1,
  gxAddMode                     = 2,
  gxBlendMode                   = 3,
  gxMigrateMode                 = 4,
  gxMinimumMode                 = 5,
  gxMaximumMode                 = 6,
  gxHighlightMode               = 7,
  gxAndMode                     = 8,
  gxOrMode                      = 9,
  gxXorMode                     = 10,
  gxRampAndMode                 = 11,
  gxRampOrMode                  = 12,
  gxRampXorMode                 = 13,
  gxOverMode                    = 14,   /* Alpha channel modes          */
  gxAtopMode                    = 15,   /* Note: In England = Beta channel modes   */
  gxExcludeMode                 = 16,
  gxFadeMode                    = 17
};

typedef unsigned char                   gxComponentMode;
enum {
  gxRejectSourceTransfer        = 0x0001, /* at least one component must be out of range       */
  gxRejectDeviceTransfer        = 0x0002, /* at least one component must be out of range       */
  gxSingleComponentTransfer     = 0x0004 /* duplicate gxTransferComponent[0] for all components in transfer */
};

typedef long                            gxTransferFlag;
enum {
  gxOverResultComponent         = 0x01, /* & result gxColor with 0xFFFF before clamping   */
  gxReverseComponent            = 0x02  /* reverse source and device before moding       */
};

typedef unsigned char                   gxComponentFlag;
/* gxInk structures */
struct gxTransferComponent {
  gxComponentMode     mode;                   /* how the component is operated upon */
  gxComponentFlag     flags;                  /* flags for each component   */
  gxColorValue        sourceMinimum;
  gxColorValue        sourceMaximum;          /* input filter range */
  gxColorValue        deviceMinimum;
  gxColorValue        deviceMaximum;          /* output filter range */
  gxColorValue        clampMinimum;
  gxColorValue        clampMaximum;           /* output clamping range */
  gxColorValue        operand;                /* ratio for blend, step for migrate, gxColor for highlight   */
};
typedef struct gxTransferComponent      gxTransferComponent;
struct gxTransferMode {
    gxColorSpace        space;          /* the gxColor-space the transfer mode is to operate in */
    gxColorSet          set;
    gxColorProfile      profile;
    Fixed               sourceMatrix[5][4];
    Fixed               deviceMatrix[5][4];
    Fixed               resultMatrix[5][4];
    gxTransferFlag      flags;
    gxTransferComponent component[4];  /* how each component is operated upon           */
};
typedef struct gxTransferMode gxTransferMode;

/* gxColor space enumerations */
enum {
  gxNoColorPacking              = 0x0000, /* 16 bits per channel */
  gxAlphaSpace                  = 0x0080, /* space includes alpha channel */
  gxWord5ColorPacking           = 0x0500, /* 5 bits per channel, right-justified */
  gxLong8ColorPacking           = 0x0800, /* 8 bits per channel, right-justified */
  gxLong10ColorPacking          = 0x0A00, /* 10 bits per channel, right-justified */
  gxAlphaFirstPacking           = 0x1000 /* alpha channel is the first field in the packed space */
};

enum {
  gxNoSpace                     = 0,
  gxRGBSpace                    = 1,
  gxCMYKSpace                   = 2,
  gxHSVSpace                    = 3,
  gxHLSSpace                    = 4,
  gxYXYSpace                    = 5,
  gxXYZSpace                    = 6,
  gxLUVSpace                    = 7,
  gxLABSpace                    = 8,
  gxYIQSpace                    = 9,
  gxNTSCSpace                   = gxYIQSpace,
  gxPALSpace                    = gxYIQSpace,
  gxGraySpace                   = 10,
  gxIndexedSpace                = 11,
  gxRGBASpace                   = gxRGBSpace + gxAlphaSpace,
  gxGrayASpace                  = gxGraySpace + gxAlphaSpace,
  gxRGB16Space                  = gxWord5ColorPacking + gxRGBSpace,
  gxRGB32Space                  = gxLong8ColorPacking + gxRGBSpace,
  gxARGB32Space                 = gxLong8ColorPacking + gxAlphaFirstPacking + gxRGBASpace,
  gxCMYK32Space                 = gxLong8ColorPacking + gxCMYKSpace,
  gxHSV32Space                  = gxLong10ColorPacking + gxHSVSpace,
  gxHLS32Space                  = gxLong10ColorPacking + gxHLSSpace,
  gxYXY32Space                  = gxLong10ColorPacking + gxYXYSpace,
  gxXYZ32Space                  = gxLong10ColorPacking + gxXYZSpace,
  gxLUV32Space                  = gxLong10ColorPacking + gxLUVSpace,
  gxLAB32Space                  = gxLong10ColorPacking + gxLABSpace,
  gxYIQ32Space                  = gxLong10ColorPacking + gxYIQSpace,
  gxNTSC32Space                 = gxYIQ32Space,
  gxPAL32Space                  = gxYIQ32Space
};

/* gxColor space structures */
struct gxRGBColor {
  gxColorValue        red;
  gxColorValue        green;
  gxColorValue        blue;
};
typedef struct gxRGBColor               gxRGBColor;
struct gxRGBAColor {
  gxColorValue        red;
  gxColorValue        green;
  gxColorValue        blue;
  gxColorValue        alpha;
};
typedef struct gxRGBAColor              gxRGBAColor;
struct gxHSVColor {
  gxColorValue        hue;
  gxColorValue        saturation;
  gxColorValue        value;
};
typedef struct gxHSVColor               gxHSVColor;
struct gxHLSColor {
  gxColorValue        hue;
  gxColorValue        lightness;
  gxColorValue        saturation;
};
typedef struct gxHLSColor               gxHLSColor;
struct gxCMYKColor {
  gxColorValue        cyan;
  gxColorValue        magenta;
  gxColorValue        yellow;
  gxColorValue        black;
};
typedef struct gxCMYKColor              gxCMYKColor;
struct gxXYZColor {
  gxColorValue        x;
  gxColorValue        y;
  gxColorValue        z;
};
typedef struct gxXYZColor               gxXYZColor;
struct gxYXYColor {
  gxColorValue        capY;
  gxColorValue        x;
  gxColorValue        y;
};
typedef struct gxYXYColor               gxYXYColor;
struct gxLUVColor {
  gxColorValue        l;
  gxColorValue        u;
  gxColorValue        v;
};
typedef struct gxLUVColor               gxLUVColor;
struct gxLABColor {
  gxColorValue        l;
  gxColorValue        a;
  gxColorValue        b;
};
typedef struct gxLABColor               gxLABColor;
struct gxYIQColor {
  gxColorValue        y;
  gxColorValue        i;
  gxColorValue        q;
};
typedef struct gxYIQColor               gxYIQColor;
struct gxGrayAColor {
  gxColorValue        gray;
  gxColorValue        alpha;
};
typedef struct gxGrayAColor             gxGrayAColor;

typedef long                            gxColorIndex;
struct gxIndexedColor {
    gxColorIndex    index;
    gxColorSet      set;
};
typedef struct gxIndexedColor gxIndexedColor;
struct gxColor {
  gxColorSpace        space;
  gxColorProfile      profile;
  union {
    gxCMYKColor         cmyk;
    gxRGBColor          rgb;
    gxRGBAColor         rgba;
    gxHSVColor          hsv;
    gxHLSColor          hls;
    gxXYZColor          xyz;
    gxYXYColor          yxy;
    gxLUVColor          luv;
    gxLABColor          lab;
    gxYIQColor          yiq;
    gxColorValue        gray;
    gxGrayAColor        graya;
    unsigned short      pixel16;
    unsigned long       pixel32;
    gxIndexedColor      indexed;
    gxColorValue        component[4];
  }                       element;
};
typedef struct gxColor                  gxColor;

/* gxColorSet structures */
union gxSetColor {
  gxCMYKColor         cmyk;
  gxRGBColor          rgb;
  gxRGBAColor         rgba;
  gxHSVColor          hsv;
  gxHLSColor          hls;
  gxXYZColor          xyz;
  gxYXYColor          yxy;
  gxLUVColor          luv;
  gxLABColor          lab;
  gxYIQColor          yiq;
  gxColorValue        gray;
  gxGrayAColor        graya;
  unsigned short      pixel16;
  unsigned long       pixel32;
  gxColorValue        component[4];
};
typedef union gxSetColor                gxSetColor;
/* gxTransform enumerations */
/* parts of a gxShape considered in hit testing: */
enum {
  gxNoPart                      = 0,    /* (in order of evaluation) */
  gxBoundsPart                  = 0x0001,
  gxGeometryPart                = 0x0002,
  gxPenPart                     = 0x0004,
  gxCornerPointPart             = 0x0008,
  gxControlPointPart            = 0x0010,
  gxEdgePart                    = 0x0020,
  gxJoinPart                    = 0x0040,
  gxStartCapPart                = 0x0080,
  gxEndCapPart                  = 0x0100,
  gxDashPart                    = 0x0200,
  gxPatternPart                 = 0x0400,
  gxGlyphBoundsPart             = gxJoinPart,
  gxGlyphFirstPart              = gxStartCapPart,
  gxGlyphLastPart               = gxEndCapPart,
  gxSideBearingPart             = gxDashPart,
  gxAnyPart                     = gxBoundsPart | gxGeometryPart | gxPenPart | gxCornerPointPart | gxControlPointPart | gxEdgePart | gxJoinPart | gxStartCapPart | gxEndCapPart | gxDashPart | gxPatternPart
};


typedef long                            gxShapePart;
/* gxTransform structures */
struct gxHitTestInfo {
  gxShapePart         what;                   /* which part of gxShape */
  long                index;                  /* control gxPoint index */
  Fixed               distance;               /* how far from gxPoint or outside of area click was */

                                              /* these fields are only set by GXHitTestPicture */
  gxShape             which;
  gxShape             containerPicture;       /* picture which contains gxShape hit */
  long                containerIndex;         /* the index within that picture  */
  long                totalIndex;             /* the total index within the root picture */
};
typedef struct gxHitTestInfo            gxHitTestInfo;
/* gxViewPort enumerations */
enum {
  gxGrayPort                    = 0x0001,
  gxAlwaysGridPort              = 0x0002,
  gxEnableMatchPort             = 0x0004
};


typedef long                            gxPortAttribute;
/* gxViewDevice enumerations */
enum {
  gxDirectDevice                = 0x01, /* for the device gxBitmap baseAddr pointer */
  gxRemoteDevice                = 0x02,
  gxInactiveDevice              = 0x04
};

typedef long                            gxDeviceAttribute;
enum {
  gxRoundDot                    = 1,
  gxSpiralDot                   = 2,
  gxSquareDot                   = 3,
  gxLineDot                     = 4,
  gxEllipticDot                 = 5,
  gxTriangleDot                 = 6,
  gxDispersedDot                = 7,
  gxCustomDot                   = 8
};

typedef long                            gxDotType;
/* gxViewPort structures */
enum {
  gxNoTint                      = 0,
  gxLuminanceTint               = 1,    /* use the luminance of the gxColor */
  gxAverageTint                 = 2,    /* add all the components and divide by the number of components */
  gxMixtureTint                 = 3,    /* find the closest gxColor on the axis between the foreground and background */
  gxComponent1Tint              = 4,    /* use the value of the first component of the gxColor */
  gxComponent2Tint              = 5,    /* ... etc. */
  gxComponent3Tint              = 6,
  gxComponent4Tint              = 7
};

typedef long                            gxTintType;
struct gxHalftone {
  Fixed               angle;
  Fixed               frequency;
  gxDotType           method;
  gxTintType          tinting;
  gxColor             dotColor;
  gxColor             backgroundColor;
  gxColorSpace        tintSpace;
};
typedef struct gxHalftone               gxHalftone;
struct gxHalftoneMatrix {
  Fixed               dpiX;                   /* intended resolution */
  Fixed               dpiY;
  long                width;                  /* width of matrix (in device pixels) */
  long                height;                 /* height of matrix (in device pixels) */
  long                tileShift;              /* shift amount (in samples) for rectangular tiling */
  unsigned short      samples[1];             /* samples from 0..MAX(halftone tintSpace) */
};
typedef struct gxHalftoneMatrix         gxHalftoneMatrix;
/* gxViewGroup enumerations */
#define gxAllViewDevices        ((gxViewGroup) 0)
#define gxScreenViewDevices     ((gxViewGroup) 1)
/* graphics stream constants and structures */
enum {
  gxOpenReadSpool               = 1,
  gxOpenWriteSpool              = 2,
  gxReadSpool                   = 3,
  gxWriteSpool                  = 4,
  gxCloseSpool                  = 5
};


typedef long                            gxSpoolCommand;
typedef unsigned char                   gxGraphicsOpcode;
typedef struct gxSpoolBlock             gxSpoolBlock;
typedef CALLBACK_API_C( long , gxSpoolProcPtr )(gxSpoolCommand command, gxSpoolBlock *block);
typedef STACK_UPP_TYPE(gxSpoolProcPtr)                          gxSpoolUPP;
struct gxSpoolBlock {
  gxSpoolUPP          spoolProcedure;         /* these fields are read only */
  void *              buffer;                 /* source/destination pointer to data */
  long                bufferSize;             /* how many bytes for the system to read (flatten) / write (unflatten) */
                                              /* these fields are written to (but are not read from) */
  long                count;                  /* how many bytes for the caller to read (unflatten) /write (flatten) */
  long                operationSize;          /* operation size (including operand byte) */
  long                operationOffset;        /* the data offset, if any, within the current operation */
  gxGraphicsOpcode    lastTypeOpcode;         /* type of last created object */
  gxGraphicsOpcode    currentOperation;       /* operation emitted by flatten, or intrepreted by last unflatten */
  gxGraphicsOpcode    currentOperand;         /* e.g., gxTransformTypeOpcode, gxInkTagOpcode */
  unsigned char       compressed;             /* one of: gxTwoBitCompressionValues */
};

#if CALL_NOT_IN_CARBON
/*
 *  NewgxSpoolUPP()
 *  
 *  Availability:
 *    Non-Carbon CFM:   available as macro/inline
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxSpoolUPP )
NewgxSpoolUPP(gxSpoolProcPtr userRoutine);
#if !OPAQUE_UPP_TYPES
  enum { uppgxSpoolProcInfo = 0x000003F1 };  /* 4_bytes Func(4_bytes, 4_bytes) */
  #ifdef __cplusplus
    inline DEFINE_API_C(gxSpoolUPP) NewgxSpoolUPP(gxSpoolProcPtr userRoutine) { return (gxSpoolUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppgxSpoolProcInfo, GetCurrentArchitecture()); }
  #else
    #define NewgxSpoolUPP(userRoutine) (gxSpoolUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppgxSpoolProcInfo, GetCurrentArchitecture())
  #endif
#endif

/*
 *  DisposegxSpoolUPP()
 *  
 *  Availability:
 *    Non-Carbon CFM:   available as macro/inline
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
DisposegxSpoolUPP(gxSpoolUPP userUPP);
#if !OPAQUE_UPP_TYPES
  #ifdef __cplusplus
      inline DEFINE_API_C(void) DisposegxSpoolUPP(gxSpoolUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); }
  #else
      #define DisposegxSpoolUPP(userUPP) DisposeRoutineDescriptor(userUPP)
  #endif
#endif

/*
 *  InvokegxSpoolUPP()
 *  
 *  Availability:
 *    Non-Carbon CFM:   available as macro/inline
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( long )
InvokegxSpoolUPP(
  gxSpoolCommand  command,
  gxSpoolBlock *  block,
  gxSpoolUPP      userUPP);
#if !OPAQUE_UPP_TYPES
  #ifdef __cplusplus
      inline DEFINE_API_C(long) InvokegxSpoolUPP(gxSpoolCommand command, gxSpoolBlock * block, gxSpoolUPP userUPP) { return (long)CALL_TWO_PARAMETER_UPP(userUPP, uppgxSpoolProcInfo, command, block); }
  #else
    #define InvokegxSpoolUPP(command, block, userUPP) (long)CALL_TWO_PARAMETER_UPP((userUPP), uppgxSpoolProcInfo, (command), (block))
  #endif
#endif

#endif  /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON || OLDROUTINENAMES
    /* support for pre-Carbon UPP routines: New...Proc and Call...Proc */
    #define NewgxSpoolProc(userRoutine)                         NewgxSpoolUPP(userRoutine)
    #define CallgxSpoolProc(userRoutine, command, block)        InvokegxSpoolUPP(command, block, userRoutine)
#endif /* CALL_NOT_IN_CARBON */


enum {
  gxFontListFlatten             = 0x01, /* if set, generate a gxTag containing list of each gxFont referenced */
  gxFontGlyphsFlatten           = 0x02, /* if set, generate a gxTag containing the list of glyphs referenced inside the gxFont */
  gxFontVariationsFlatten       = 0x04, /* if set, append the gxTag with separate [variation] coordinates */
  gxBitmapAliasFlatten          = 0x08  /* if set, open bitmap alias files and flatten out their image data */
};


typedef long                            gxFlattenFlag;
/* gxGraphicsClient constants */
#define gxGraphicsSystemClient      (gxGraphicsClient)(-1)
enum {
  gxStaticHeapClient            = 0x0001
};

typedef long                            gxClientAttribute;
/* graphics patching constants */
enum {
  gxOriginalGraphicsFunction    = -1,
  gxOriginalGraphicsIdentifier  = FOUR_CHAR_CODE('grfx')
};

struct gxBitmapDataSourceAlias {
  unsigned long       fileOffset;             /* file offset (in bytes) of top-left pixel */
  unsigned long       aliasRecordSize;        /* size of alias record below */
  unsigned char       aliasRecord[1];         /* the actual alias record data */
};
typedef struct gxBitmapDataSourceAlias  gxBitmapDataSourceAlias;
enum {
  gxBitmapFileAliasTagType      = FOUR_CHAR_CODE('bfil'),
  gxPICTFileAliasTagType        = FOUR_CHAR_CODE('pict'),
  gxBitmapFileAliasImageValue   = 1L
};

typedef struct OpaquegxFont*            gxFont;
enum {
  gxNoPlatform                  = 0,
  gxNoScript                    = 0,
  gxNoLanguage                  = 0,
  gxNoFontName                  = 0,
  gxGlyphPlatform               = -1
};

enum {
  gxUnicodePlatform             = 1,
  gxMacintoshPlatform           = 2,
  gxReservedPlatform            = 3,
  gxMicrosoftPlatform           = 4,
  gxCustomPlatform              = 5
};


typedef long                            gxFontPlatform;
enum {
  gxUnicodeDefaultSemantics     = 1,
  gxUnicodeV1_1Semantics        = 2,
  gxISO10646_1993Semantics      = 3
};

enum {
  gxRomanScript                 = 1,
  gxJapaneseScript              = 2,
  gxTraditionalChineseScript    = 3,
  gxChineseScript               = gxTraditionalChineseScript,
  gxKoreanScript                = 4,
  gxArabicScript                = 5,
  gxHebrewScript                = 6,
  gxGreekScript                 = 7,
  gxCyrillicScript              = 8,
  gxRussian                     = gxCyrillicScript,
  gxRSymbolScript               = 9,
  gxDevanagariScript            = 10,
  gxGurmukhiScript              = 11,
  gxGujaratiScript              = 12,
  gxOriyaScript                 = 13,
  gxBengaliScript               = 14,
  gxTamilScript                 = 15,
  gxTeluguScript                = 16,
  gxKannadaScript               = 17,
  gxMalayalamScript             = 18,
  gxSinhaleseScript             = 19,
  gxBurmeseScript               = 20,
  gxKhmerScript                 = 21,
  gxThaiScript                  = 22,
  gxLaotianScript               = 23,
  gxGeorgianScript              = 24,
  gxArmenianScript              = 25,
  gxSimpleChineseScript         = 26,
  gxTibetanScript               = 27,
  gxMongolianScript             = 28,
  gxGeezScript                  = 29,
  gxEthiopicScript              = gxGeezScript,
  gxAmharicScript               = gxGeezScript,
  gxSlavicScript                = 30,
  gxEastEuropeanRomanScript     = gxSlavicScript,
  gxVietnameseScript            = 31,
  gxExtendedArabicScript        = 32,
  gxSindhiScript                = gxExtendedArabicScript,
  gxUninterpretedScript         = 33
};

enum {
  gxMicrosoftSymbolScript       = 1,
  gxMicrosoftStandardScript     = 2
};

enum {
  gxCustom8BitScript            = 1,
  gxCustom816BitScript          = 2,
  gxCustom16BitScript           = 3
};

typedef long                            gxFontScript;
enum {
  gxEnglishLanguage             = 1,
  gxFrenchLanguage              = 2,
  gxGermanLanguage              = 3,
  gxItalianLanguage             = 4,
  gxDutchLanguage               = 5,
  gxSwedishLanguage             = 6,
  gxSpanishLanguage             = 7,
  gxDanishLanguage              = 8,
  gxPortugueseLanguage          = 9,
  gxNorwegianLanguage           = 10,
  gxHebrewLanguage              = 11,
  gxJapaneseLanguage            = 12,
  gxArabicLanguage              = 13,
  gxFinnishLanguage             = 14,
  gxGreekLanguage               = 15,
  gxIcelandicLanguage           = 16,
  gxMalteseLanguage             = 17,
  gxTurkishLanguage             = 18,
  gxCroatianLanguage            = 19,
  gxTradChineseLanguage         = 20,
  gxUrduLanguage                = 21,
  gxHindiLanguage               = 22,
  gxThaiLanguage                = 23,
  gxKoreanLanguage              = 24,
  gxLithuanianLanguage          = 25,
  gxPolishLanguage              = 26,
  gxHungarianLanguage           = 27,
  gxEstonianLanguage            = 28,
  gxLettishLanguage             = 29,
  gxLatvianLanguage             = gxLettishLanguage,
  gxSaamiskLanguage             = 30,
  gxLappishLanguage             = gxSaamiskLanguage,
  gxFaeroeseLanguage            = 31,
  gxFarsiLanguage               = 32,
  gxPersianLanguage             = gxFarsiLanguage,
  gxRussianLanguage             = 33,
  gxSimpChineseLanguage         = 34,
  gxFlemishLanguage             = 35,
  gxIrishLanguage               = 36,
  gxAlbanianLanguage            = 37,
  gxRomanianLanguage            = 38,
  gxCzechLanguage               = 39,
  gxSlovakLanguage              = 40,
  gxSlovenianLanguage           = 41,
  gxYiddishLanguage             = 42,
  gxSerbianLanguage             = 43,
  gxMacedonianLanguage          = 44,
  gxBulgarianLanguage           = 45,
  gxUkrainianLanguage           = 46,
  gxByelorussianLanguage        = 47,
  gxUzbekLanguage               = 48,
  gxKazakhLanguage              = 49,
  gxAzerbaijaniLanguage         = 50,
  gxAzerbaijanArLanguage        = 51,
  gxArmenianLanguage            = 52,
  gxGeorgianLanguage            = 53,
  gxMoldavianLanguage           = 54,
  gxKirghizLanguage             = 55,
  gxTajikiLanguage              = 56,
  gxTurkmenLanguage             = 57,
  gxMongolianLanguage           = 58,
  gxMongolianCyrLanguage        = 59,
  gxPashtoLanguage              = 60,
  gxKurdishLanguage             = 61,
  gxKashmiriLanguage            = 62,
  gxSindhiLanguage              = 63,
  gxTibetanLanguage             = 64,
  gxNepaliLanguage              = 65,
  gxSanskritLanguage            = 66,
  gxMarathiLanguage             = 67,
  gxBengaliLanguage             = 68,
  gxAssameseLanguage            = 69,
  gxGujaratiLanguage            = 70,
  gxPunjabiLanguage             = 71,
  gxOriyaLanguage               = 72,
  gxMalayalamLanguage           = 73,
  gxKannadaLanguage             = 74,
  gxTamilLanguage               = 75,
  gxTeluguLanguage              = 76,
  gxSinhaleseLanguage           = 77,
  gxBurmeseLanguage             = 78,
  gxKhmerLanguage               = 79,
  gxLaoLanguage                 = 80,
  gxVietnameseLanguage          = 81,
  gxIndonesianLanguage          = 82,
  gxTagalogLanguage             = 83,
  gxMalayRomanLanguage          = 84,
  gxMalayArabicLanguage         = 85,
  gxAmharicLanguage             = 86,
  gxTigrinyaLanguage            = 87,
  gxGallaLanguage               = 88,
  gxOromoLanguage               = gxGallaLanguage,
  gxSomaliLanguage              = 89,
  gxSwahiliLanguage             = 90,
  gxRuandaLanguage              = 91,
  gxRundiLanguage               = 92,
  gxChewaLanguage               = 93,
  gxMalagasyLanguage            = 94,
  gxEsperantoLanguage           = 95,
  gxWelshLanguage               = 129,
  gxBasqueLanguage              = 130,
  gxCatalanLanguage             = 131,
  gxLatinLanguage               = 132,
  gxQuechuaLanguage             = 133,
  gxGuaraniLanguage             = 134,
  gxAymaraLanguage              = 135,
  gxTatarLanguage               = 136,
  gxUighurLanguage              = 137,
  gxDzongkhaLanguage            = 138,
  gxJavaneseRomLanguage         = 139,
  gxSundaneseRomLanguage        = 140
};

typedef long                            gxFontLanguage;
enum {
  gxCopyrightFontName           = 1,
  gxFamilyFontName              = 2,
  gxStyleFontName               = 3,
  gxUniqueFontName              = 4,
  gxFullFontName                = 5,
  gxVersionFontName             = 6,
  gxPostscriptFontName          = 7,
  gxTrademarkFontName           = 8,
  gxManufacturerFontName        = 9,
  gxLastReservedFontName        = 256
};

typedef long                            gxFontName;
typedef long                            gxFontTableTag;
typedef long                            gxFontVariationTag;
typedef long                            gxFontFormatTag;
typedef long                            gxFontStorageTag;
typedef gxFontVariationTag              gxFontDescriptorTag;
struct gxFontVariation {
  gxFontVariationTag  name;
  Fixed               value;
};
typedef struct gxFontVariation          gxFontVariation;
typedef gxFontVariation                 gxFontDescriptor;
struct gxFontFeatureSetting {
  unsigned short      setting;
  unsigned short      nameID;
};
typedef struct gxFontFeatureSetting     gxFontFeatureSetting;
enum {
  gxSystemFontAttribute         = 0x0001,
  gxReadOnlyFontAttribute       = 0x0002
};


typedef long                            gxFontAttribute;
enum {
  gxMutuallyExclusiveFeature    = 0x00008000
};

typedef long                            gxFontFeatureFlag;
typedef long                            gxFontFeature;
enum {
  gxResourceFontStorage         = FOUR_CHAR_CODE('rsrc'),
  gxHandleFontStorage           = FOUR_CHAR_CODE('hndl'),
  gxFileFontStorage             = FOUR_CHAR_CODE('bass'),
  gxNfntFontStorage             = FOUR_CHAR_CODE('nfnt')
};

typedef void *                          gxFontStorageReference;
typedef unsigned short                  gxGlyphcode;
/* single glyph in a font */
/* byte offset within backing store */
typedef long                            gxByteOffset;
/* The actual constants for feature types and selectors have been moved to a library. */
typedef unsigned short                  gxRunFeatureType;
typedef unsigned short                  gxRunFeatureSelector;
/* If tracking is not desired, specify the following value in the track field in the
        gxRunControls record (note that a track of 0 does *not* mean to turn tracking off;
        rather, it means to use normal tracking). */
enum {
  gxNoTracking                  = gxNegativeInfinity
};

/* The special "gxNoStake" value is returned by the GXGetLayoutBreakOffset call to
        indicate the absence of a character offset that is stable with respect to
        metamorphosis and contextual kerning. */
enum {
  gxNoStake                     = -1
};

/* A glyph's behavior with respect to other glyphs on its line is defined in part by its
        gxBaselineType. These types allow correct alignment of the baselines of all glyphs on
        the line. */
enum {
  gxRomanBaseline               = 0,
  gxIdeographicCenterBaseline   = 1,
  gxIdeographicLowBaseline      = 2,
  gxHangingBaseline             = 3,
  gxMathBaseline                = 4,
  gxLastBaseline                = 31,
  gxNumberOfBaselineTypes       = gxLastBaseline + 1,
  gxNoOverrideBaseline          = 255
};

typedef unsigned long                   gxBaselineType;
typedef Fixed                           gxBaselineDeltas[32];
/* gxJustificationPriority defines the point during the justification process at which a
    glyph will begin to receive deltas before and after itself. */
enum {
  gxKashidaPriority             = 0,
  gxWhiteSpacePriority          = 1,
  gxInterCharPriority           = 2,
  gxNullJustificationPriority   = 3,
  gxNumberOfJustificationPriorities = 4
};

typedef unsigned char                   gxJustificationPriority;
/* gxJustificationFlags are used to control which fields of a gxWidthDeltaRecord are to
        be overridden and which are not if a gxPriorityJustificationOverride or
        gxGlyphJustificationOverride (qq.v.) is specified. */
enum {
  gxOverridePriority            = 0x8000, /* use priority value from override */
  gxOverrideLimits              = 0x4000, /* use limits values from override */
  gxOverrideUnlimited           = 0x2000, /* use unlimited flag from override */
  gxUnlimitedGapAbsorption      = 0x1000, /* glyph can take unlimited gap */
  gxJustificationPriorityMask   = 0x000F, /* justification priority */
  gxAllJustificationFlags       = (gxOverridePriority | gxOverrideLimits | gxOverrideUnlimited | gxUnlimitedGapAbsorption | gxJustificationPriorityMask)
};

typedef unsigned short                  gxJustificationFlags;
/* The directional behavior of a glyph can be overridden using a gxDirectionOverride. */
enum {
  gxNoDirectionOverride         = 0,
  gxImposeLeftToRight           = 1,
  gxImposeRightToLeft           = 2,
  gxImposeArabic                = 3
};

typedef unsigned short                  gxDirectionOverride;
/* gxRunControlFlags describe the nonparametric layout options contained in a gxStyle. */
enum {
  gxNoCaretAngle                = 0x40000000,
  gxImposeWidth                 = 0x20000000,
  gxNoCrossKerning              = 0x10000000,
  gxNoOpticalAlignment          = 0x08000000,
  gxForceHanging                = 0x04000000,
  gxNoSpecialJustification      = 0x02000000,
  gxDirectionOverrideMask       = 0x00000003,
  gxNoLigatureSplits            = (long)0x80000000
};

enum {
  gxAllRunControlFlags          = (gxNoLigatureSplits | gxNoCaretAngle | gxImposeWidth | gxNoCrossKerning | gxNoOpticalAlignment | gxForceHanging | gxNoSpecialJustification | gxDirectionOverrideMask)
};

typedef unsigned long                   gxRunControlFlags;
/* gxHighlightType is used to distinguish various highlighting methods, both in terms of
        character offset based vs. visual based, and in terms of angled sides vs. non-angled
        sides. */
enum {
  gxHighlightStraight           = 0,    /* straight-edged simple highlighting */
  gxHighlightAverageAngle       = 1     /* takes average of two edge angles */
};

typedef unsigned long                   gxHighlightType;
/* gxCaretType is used to control whether the caret that is returned from GXGetLayoutCaret
        is a split caret or a (keyboard-syncronized) single caret. */
enum {
  gxSplitCaretType              = 0,    /* returns Mac-style split caret (default) */
  gxLeftRightKeyboardCaret      = 1,    /* single caret in left-right position */
  gxRightLeftKeyboardCaret      = 2     /* single caret in right-left position */
};

typedef unsigned long                   gxCaretType;
/* gxLayoutOffsetState describes the characteristics of a given gxByteOffset in some
        layout. It is returned by the GXGetOffsetGlyphs call. Note that the
        gxOffsetInsideLigature value is returned in addition to the 8/16 (or invalid)
        indication. */
enum {
  gxOffset8_8                   = 0,
  gxOffset8_16                  = 1,
  gxOffset16_8                  = 2,
  gxOffset16_16                 = 3,
  gxOffsetInvalid               = 4
};

enum {
  gxOffsetInsideLigature        = 0x8000
};

typedef unsigned short                  gxLayoutOffsetState;
/* gxLayoutOptionsFlags are single-bit flags contained in a gxLayoutOptions record. We
    also define here some utility constants that are useful in setting various fields in
    the gxLayoutOptions record. */
enum {
  gxNoLayoutOptions             = 0,
  gxLineIsDisplayOnly           = 0x00000001,
  gxKeepSpacesInMargin          = 0x00000002,
  gxLimitReorderingToTwoLevels  = 0x00000004,
  gxLineLeftEdgeNotAtMargin     = 0x00000008,
  gxLineRightEdgeNotAtMargin    = 0x00000010,
  gxAllLayoutOptionsFlags       = gxLineIsDisplayOnly | gxKeepSpacesInMargin | gxLimitReorderingToTwoLevels | gxLineLeftEdgeNotAtMargin | gxLineRightEdgeNotAtMargin,
  gxMaxRunLevel                 = 15,
  gxFlushLeft                   = 0,
  gxFlushCenter                 = fract1 / 2,
  gxFlushRight                  = fract1,
  gxNoJustification             = 0,
  gxFullJustification           = fract1
};

typedef unsigned long                   gxLayoutOptionsFlags;
/* A gxRunFeature describes a feature and a level for that feature. */
struct gxRunFeature {
  gxRunFeatureType    featureType;
  gxRunFeatureSelector  featureSelector;
};
typedef struct gxRunFeature             gxRunFeature;
/* A gxWidthDeltaRecord contains all of the information needed to describe the behavior of one
        class of glyphs during the justification process. */
struct gxWidthDeltaRecord {
  Fixed               beforeGrowLimit;        /* ems AW can grow by at most on LT */
  Fixed               beforeShrinkLimit;      /* ems AW can shrink by at most on LT */
  Fixed               afterGrowLimit;         /* ems AW can grow by at most on RB */
  Fixed               afterShrinkLimit;       /* ems AW can shrink by at most on RB */
  gxJustificationFlags  growFlags;            /* flags controlling grow case */
  gxJustificationFlags  shrinkFlags;          /* flags controlling shrink case */
};
typedef struct gxWidthDeltaRecord       gxWidthDeltaRecord;
/* A gxPriorityJustificationOverride contains an array of WidthDeltaRecords, one for each
        gxJustificationPriority. */
struct gxPriorityJustificationOverride {
  gxWidthDeltaRecord  deltas[4];              /* overrides for each of the priorities */
};
typedef struct gxPriorityJustificationOverride gxPriorityJustificationOverride;
/* A gxGlyphJustificationOverride contains a gxWidthDeltaRecord that is to be used for a
        specific glyph in a specific run (this limitation is because glyphcodes vary by font). */
struct gxGlyphJustificationOverride {
  gxGlyphcode         glyph;
  gxWidthDeltaRecord  override;
};
typedef struct gxGlyphJustificationOverride gxGlyphJustificationOverride;

/* gxRunControls contains flags, shifts, imposed widths and overrides for a run. */
/* NOTE: a value of "gxNoTracking" (see above) in track disables tracking */
struct gxRunControls {
  gxRunControlFlags   flags;
  Fixed               beforeWithStreamShift;
  Fixed               afterWithStreamShift;
  Fixed               crossStreamShift;
  Fixed               imposedWidth;
  Fixed               track;
  Fract               hangingInhibitFactor;
  Fract               kerningInhibitFactor;
  Fixed               decompositionAdjustmentFactor;
  gxBaselineType      baselineType;
};
typedef struct gxRunControls            gxRunControls;
/* A gxGlyphSubstitution describes one client-provided substitution that occurs after all
        other automatic glyph changes have happened. */
struct gxGlyphSubstitution {
  gxGlyphcode         originalGlyph;          /* Whenever you see this glyph... */
  gxGlyphcode         substituteGlyph;        /* ...change it to this one. */
};
typedef struct gxGlyphSubstitution      gxGlyphSubstitution;
/* gxKerningAdjustmentFactors specify an adjustment to automatic kerning. The adjustment
        is ax + b where x is the automatic kerning value, a is scaleFactor, and b is
        adjustmentPointSizeFactor times the run's point size. */
struct gxKerningAdjustmentFactors {
  Fract               scaleFactor;
  Fixed               adjustmentPointSizeFactor;
};
typedef struct gxKerningAdjustmentFactors gxKerningAdjustmentFactors;
/* A gxKerningAdjustment identifies with- and cross-stream kerning adjustments
        for specific glyph pairs. */
struct gxKerningAdjustment {
  gxGlyphcode         firstGlyph;
  gxGlyphcode         secondGlyph;
  gxKerningAdjustmentFactors  withStreamFactors;
  gxKerningAdjustmentFactors  crossStreamFactors;
};
typedef struct gxKerningAdjustment      gxKerningAdjustment;
/* A value of gxResetCrossStreamFactor in crossStreamFactors.adjustmentPointSizeFactor
        will reset the cross-stream kerning to the baseline. */
enum {
  gxResetCrossStreamFactor      = gxNegativeInfinity
};

/* gxLayoutHitInfo contains the output from the GXHitTestLayout call. */
struct gxLayoutHitInfo {
  Fixed               firstPartialDist;
  Fixed               lastPartialDist;
  gxByteOffset        hitSideOffset;
  gxByteOffset        nonHitSideOffset;
  Boolean             leadingEdge;
  Boolean             inLoose;
};
typedef struct gxLayoutHitInfo          gxLayoutHitInfo;
/* A gxLineBaselineRecord contains the deltas from 0 to all the different baselines for
        the layout. It can be filled via a call to GetBaselineDeltas (q.v.). */
struct gxLineBaselineRecord {
  gxBaselineDeltas    deltas;
};
typedef struct gxLineBaselineRecord     gxLineBaselineRecord;
/* The gxLayoutOptions type contains information about the layout characteristics of the
        whole line. */
struct gxLayoutOptions {
  Fixed               width;
  Fract               flush;
  Fract               just;
  gxLayoutOptionsFlags  flags;
  gxLineBaselineRecord * baselineRec;
};
typedef struct gxLayoutOptions          gxLayoutOptions;
enum {
  gxNewObjectOpcode             = 0x00, /* create new object */
  gxSetDataOpcode               = 0x40, /* add reference to current object */
  gxSetDefaultOpcode            = 0x80, /* replace current default with this object */
  gxReservedOpcode              = 0xC0, /* (may be used in future expansion) */
  gxNextOpcode                  = 0xFF  /* used by currentOperand field to say opcode is coming */
};

/* new object types (new object opcode) */
enum {
  gxHeaderTypeOpcode            = 0x00, /* byte following new object uses bottom 6 bits for type */
                                        /* gxShape types use values 1 (gxEmptyType) through 13 (gxPictureType) */
  gxStyleTypeOpcode             = 0x28,
  gxInkTypeOpcode               = 0x29,
  gxTransformTypeOpcode         = 0x2A,
  gxColorProfileTypeOpcode      = 0x2B,
  gxColorSetTypeOpcode          = 0x2C,
  gxTagTypeOpcode               = 0x2D,
  gxBitImageOpcode              = 0x2E,
  gxFontNameTypeOpcode          = 0x2F,
  gxTrailerTypeOpcode           = 0x3F
};

/* fields of objects (set data opcodes) */
enum {
  gxShapeAttributesOpcode       = 0,
  gxShapeTagOpcode              = 1,
  gxShapeFillOpcode             = 2
};

enum {
  gxOmitPathPositionXMask       = 0xC0,
  gxOmitPathPositionYMask       = 0x30,
  gxOmitPathDeltaXMask          = 0x0C,
  gxOmitPathDeltaYMask          = 0x03
};

enum {
  gxOmitPathPositionXShift      = 6,
  gxOmitPathPositionYShift      = 4,
  gxOmitPathDeltaXShift         = 2,
  gxOmitPathDeltaYShift         = 0
};

enum {
  gxOmitBitmapImageMask         = 0xC0,
  gxOmitBitmapWidthMask         = 0x30,
  gxOmitBitmapHeightMask        = 0x0C,
  gxOmitBitmapRowBytesMask      = 0x03
};

enum {
  gxOmitBitmapImageShift        = 6,
  gxOmitBitmapWidthShift        = 4,
  gxOmitBitmapHeightShift       = 2,
  gxOmitBitmapRowBytesShift     = 0
};

enum {
  gxOmitBitmapPixelSizeMask     = 0xC0,
  gxOmitBitmapSpaceMask         = 0x30,
  gxOmitBitmapSetMask           = 0x0C,
  gxOmitBitmapProfileMask       = 0x03
};

enum {
  gxOmitBitmapPixelSizeShift    = 6,
  gxOmitBitmapSpaceShift        = 4,
  gxOmitBitmapSetShift          = 2,
  gxOmitBitmapProfileShift      = 0
};

enum {
  gxOmitBitmapPositionXMask     = 0xC0,
  gxOmitBitmapPositionYMask     = 0x30
};

enum {
  gxOmitBitmapPositionXShift    = 6,
  gxOmitBitmapPositionYShift    = 4
};

enum {
  gxOmitBitImageRowBytesMask    = 0xC0,
  gxOmitBitImageHeightMask      = 0x30,
  gxOmitBitImageDataMask        = 0x08
};

enum {
  gxOmitBitImageRowBytesShift   = 6,
  gxOmitBitImageHeightShift     = 4,
  gxOmitBitImageDataShift       = 3
};

enum {
  gxCopyBitImageBytesOpcode     = 0x00,
  gxRepeatBitImageBytesOpcode   = 0x40,
  gxLookupBitImageBytesOpcode   = 0x80,
  gxRepeatBitImageScanOpcode    = 0xC0
};

enum {
  gxOmitTextCharactersMask      = 0xC0,
  gxOmitTextPositionXMask       = 0x30,
  gxOmitTextPositionYMask       = 0x0C,
  gxOmitTextDataMask            = 0x02
};

enum {
  gxOmitTextCharactersShift     = 6,
  gxOmitTextPositionXShift      = 4,
  gxOmitTextPositionYShift      = 2,
  gxOmitTextDataShift           = 1
};

enum {
  gxOmitGlyphCharactersMask     = 0xC0,
  gxOmitGlyphLengthMask         = 0x30,
  gxOmitGlyphRunNumberMask      = 0x0C,
  gxOmitGlyphOnePositionMask    = 0x02,
  gxOmitGlyphDataMask           = 0x01
};

enum {
  gxOmitGlyphCharactersShift    = 6,
  gxOmitGlyphLengthShift        = 4,
  gxOmitGlyphRunNumberShift     = 2,
  gxOmitGlyphOnePositionShift   = 1,
  gxOmitGlyphDataShift          = 0
};

enum {
  gxOmitGlyphPositionsMask      = 0xC0,
  gxOmitGlyphAdvancesMask       = 0x20,
  gxOmitGlyphTangentsMask       = 0x18,
  gxOmitGlyphRunsMask           = 0x04,
  gxOmitGlyphStylesMask         = 0x03
};

enum {
  gxOmitGlyphPositionsShift     = 6,
  gxOmitGlyphAdvancesShift      = 5,
  gxOmitGlyphTangentsShift      = 3,
  gxOmitGlyphRunsShift          = 2,
  gxOmitGlyphStylesShift        = 0
};

enum {
  gxOmitLayoutLengthMask        = 0xC0,
  gxOmitLayoutPositionXMask     = 0x30,
  gxOmitLayoutPositionYMask     = 0x0C,
  gxOmitLayoutDataMask          = 0x02
};

enum {
  gxOmitLayoutLengthShift       = 6,
  gxOmitLayoutPositionXShift    = 4,
  gxOmitLayoutPositionYShift    = 2,
  gxOmitLayoutDataShift         = 1
};

enum {
  gxOmitLayoutWidthMask         = 0xC0,
  gxOmitLayoutFlushMask         = 0x30,
  gxOmitLayoutJustMask          = 0x0C,
  gxOmitLayoutOptionsMask       = 0x03
};

enum {
  gxOmitLayoutWidthShift        = 6,
  gxOmitLayoutFlushShift        = 4,
  gxOmitLayoutJustShift         = 2,
  gxOmitLayoutOptionsShift      = 0
};

enum {
  gxOmitLayoutStyleRunNumberMask = 0xC0,
  gxOmitLayoutLevelRunNumberMask = 0x30,
  gxOmitLayoutHasBaselineMask   = 0x08,
  gxOmitLayoutStyleRunsMask     = 0x04,
  gxOmitLayoutStylesMask        = 0x03
};

enum {
  gxOmitLayoutStyleRunNumberShift = 6,
  gxOmitLayoutLevelRunNumberShift = 4,
  gxOmitLayoutHasBaselineShift  = 3,
  gxOmitLayoutStyleRunsShift    = 2,
  gxOmitLayoutStylesShift       = 0
};

enum {
  gxOmitLayoutLevelRunsMask     = 0x80,
  gxOmitLayoutLevelsMask        = 0x40
};

enum {
  gxOmitLayoutLevelRunsShift    = 7,
  gxOmitLayoutLevelsShift       = 6
};

enum {
  gxInkAttributesOpcode         = 0,
  gxInkTagOpcode                = 1,
  gxInkColorOpcode              = 2,
  gxInkTransferModeOpcode       = 3
};

enum {
  gxOmitColorsSpaceMask         = 0xC0,
  gxOmitColorsProfileMask       = 0x30,
  gxOmitColorsComponentsMask    = 0x0F,
  gxOmitColorsIndexMask         = 0x0C,
  gxOmitColorsIndexSetMask      = 0x03
};

enum {
  gxOmitColorsSpaceShift        = 6,
  gxOmitColorsProfileShift      = 4,
  gxOmitColorsComponentsShift   = 0,
  gxOmitColorsIndexShift        = 2,
  gxOmitColorsIndexSetShift     = 0
};

enum {
  gxOmitTransferSpaceMask       = 0xC0,
  gxOmitTransferSetMask         = 0x30,
  gxOmitTransferProfileMask     = 0x0C
};

enum {
  gxOmitTransferSpaceShift      = 6,
  gxOmitTransferSetShift        = 4,
  gxOmitTransferProfileShift    = 2
};

enum {
  gxOmitTransferSourceMatrixMask = 0xC0,
  gxOmitTransferDeviceMatrixMask = 0x30,
  gxOmitTransferResultMatrixMask = 0x0C,
  gxOmitTransferFlagsMask       = 0x03
};

enum {
  gxOmitTransferSourceMatrixShift = 6,
  gxOmitTransferDeviceMatrixShift = 4,
  gxOmitTransferResultMatrixShift = 2,
  gxOmitTransferFlagsShift      = 0
};

enum {
  gxOmitTransferComponentModeMask = 0x80,
  gxOmitTransferComponentFlagsMask = 0x40,
  gxOmitTransferComponentSourceMinimumMask = 0x30,
  gxOmitTransferComponentSourceMaximumMask = 0x0C,
  gxOmitTransferComponentDeviceMinimumMask = 0x03
};

enum {
  gxOmitTransferComponentModeShift = 7,
  gxOmitTransferComponentFlagsShift = 6,
  gxOmitTransferComponentSourceMinimumShift = 4,
  gxOmitTransferComponentSourceMaximumShift = 2,
  gxOmitTransferComponentDeviceMinimumShift = 0
};

enum {
  gxOmitTransferComponentDeviceMaximumMask = 0xC0,
  gxOmitTransferComponentClampMinimumMask = 0x30,
  gxOmitTransferComponentClampMaximumMask = 0x0C,
  gxOmitTransferComponentOperandMask = 0x03
};

enum {
  gxOmitTransferComponentDeviceMaximumShift = 6,
  gxOmitTransferComponentClampMinimumShift = 4,
  gxOmitTransferComponentClampMaximumShift = 2,
  gxOmitTransferComponentOperandShift = 0
};

enum {
  gxStyleAttributesOpcode       = 0,
  gxStyleTagOpcode              = 1,
  gxStyleCurveErrorOpcode       = 2,
  gxStylePenOpcode              = 3,
  gxStyleJoinOpcode             = 4,
  gxStyleDashOpcode             = 5,
  gxStyleCapsOpcode             = 6,
  gxStylePatternOpcode          = 7,
  gxStyleTextAttributesOpcode   = 8,
  gxStyleTextSizeOpcode         = 9,
  gxStyleFontOpcode             = 10,
  gxStyleTextFaceOpcode         = 11,
  gxStylePlatformOpcode         = 12,
  gxStyleFontVariationsOpcode   = 13,
  gxStyleRunControlsOpcode      = 14,
  gxStyleRunPriorityJustOverrideOpcode = 15,
  gxStyleRunGlyphJustOverridesOpcode = 16,
  gxStyleRunGlyphSubstitutionsOpcode = 17,
  gxStyleRunFeaturesOpcode      = 18,
  gxStyleRunKerningAdjustmentsOpcode = 19,
  gxStyleJustificationOpcode    = 20
};

enum {
  gxOmitDashAttributesMask      = 0xC0,
  gxOmitDashShapeMask           = 0x30,
  gxOmitDashAdvanceMask         = 0x0C,
  gxOmitDashPhaseMask           = 0x03
};

enum {
  gxOmitDashAttributesShift     = 6,
  gxOmitDashShapeShift          = 4,
  gxOmitDashAdvanceShift        = 2,
  gxOmitDashPhaseShift          = 0
};

enum {
  gxOmitDashScaleMask           = 0xC0
};

enum {
  gxOmitDashScaleShift          = 6
};

enum {
  gxOmitPatternAttributesMask   = 0xC0,
  gxOmitPatternShapeMask        = 0x30,
  gxOmitPatternUXMask           = 0x0C,
  gxOmitPatternUYMask           = 0x03
};

enum {
  gxOmitPatternAttributesShift  = 6,
  gxOmitPatternShapeShift       = 4,
  gxOmitPatternUXShift          = 2,
  gxOmitPatternUYShift          = 0
};

enum {
  gxOmitPatternVXMask           = 0xC0,
  gxOmitPatternVYMask           = 0x30
};

enum {
  gxOmitPatternVXShift          = 6,
  gxOmitPatternVYShift          = 4
};

enum {
  gxOmitJoinAttributesMask      = 0xC0,
  gxOmitJoinShapeMask           = 0x30,
  gxOmitJoinMiterMask           = 0x0C
};

enum {
  gxOmitJoinAttributesShift     = 6,
  gxOmitJoinShapeShift          = 4,
  gxOmitJoinMiterShift          = 2
};

enum {
  gxOmitCapAttributesMask       = 0xC0,
  gxOmitCapStartShapeMask       = 0x30,
  gxOmitCapEndShapeMask         = 0x0C
};

enum {
  gxOmitCapAttributesShift      = 6,
  gxOmitCapStartShapeShift      = 4,
  gxOmitCapEndShapeShift        = 2
};

enum {
  gxOmitFaceLayersMask          = 0xC0,
  gxOmitFaceMappingMask         = 0x30
};

enum {
  gxOmitFaceLayersShift         = 6,
  gxOmitFaceMappingShift        = 4
};

enum {
  gxOmitFaceLayerFillMask       = 0xC0,
  gxOmitFaceLayerFlagsMask      = 0x30,
  gxOmitFaceLayerStyleMask      = 0x0C,
  gxOmitFaceLayerTransformMask  = 0x03
};

enum {
  gxOmitFaceLayerFillShift      = 6,
  gxOmitFaceLayerFlagsShift     = 4,
  gxOmitFaceLayerStyleShift     = 2,
  gxOmitFaceLayerTransformShift = 0
};

enum {
  gxOmitFaceLayerBoldXMask      = 0xC0,
  gxOmitFaceLayerBoldYMask      = 0x30
};

enum {
  gxOmitFaceLayerBoldXShift     = 6,
  gxOmitFaceLayerBoldYShift     = 4
};

enum {
  gxColorSetReservedOpcode      = 0,
  gxColorSetTagOpcode           = 1
};

enum {
  gxColorProfileReservedOpcode  = 0,
  gxColorProfileTagOpcode       = 1
};

enum {
  gxTransformReservedOpcode     = 0,
  gxTransformTagOpcode          = 1,
  gxTransformClipOpcode         = 2,
  gxTransformMappingOpcode      = 3,
  gxTransformPartMaskOpcode     = 4,
  gxTransformToleranceOpcode    = 5
};

enum {
  gxTypeOpcode                  = 0,
  gxSizeOpcode                  = 1
};

/* used by currentOperand when currentOperation is gxNextOpcode */
/*    format of top byte:
xx yyyyyy   xx == 0x00, 0x40, 0x80, 0xC0: defines graphics operation (see gxGraphicsOperationOpcode)
            yyyyyy == size of operation in bytes
            if (yyyyyy == 0), byte size follows. If byte following == 0, word size follows; if == 0, long follows
            word and long, if present, are specified in high-endian order (first byte is largest magnitude)
            
format of byte following size specifiers, if any:
xx yyyyyy   xx == 0x00, 0x40, 0x80, 0xC0: defines compression level (0 == none, 0xC0 == most)
            exact method of compression is defined by type of data
            yyyyyy == data type selector (0 to 63): see gxGraphicsNewOpcode, __DataOpcode
*/
enum {
  gxOpcodeShift                 = 6,
  gxObjectSizeMask              = 0x3F,
  gxCompressionShift            = 6,
  gxObjectTypeMask              = 0x3F,
  gxBitImageOpcodeMask          = 0xC0,
  gxBitImageCountMask           = 0x3F,
  gxBitImageOpcodeShift         = 6
};

enum {
  gxNoCompression               = 0,
  gxWordCompression             = 1,
  gxByteCompression             = 2,
  gxOmitCompression             = 3,
  gxCompressionMask             = 0x03
};

/*    the following structures define how primitives without a public geometry
    are stored (their format mirrors that of the New call to create them)   */
struct gxFlatFontName {
  unsigned char       name;                   /* gxFontName */
  unsigned char       platform;               /* gxFontPlatform */
  unsigned char       script;                 /* gxFontScript */
  unsigned char       language;               /* gxFontLanguage */
  short               length;                 /* byte length */
};
typedef struct gxFlatFontName           gxFlatFontName;
enum {
  gxFlatFontListItemTag         = FOUR_CHAR_CODE('flst')
};

struct gxFlatFontListItem {
  gxFont              fontID;                 /*** if we get rid of this, remove #include "font types.h", above */
  unsigned char       name;                   /* gxFontName */
  unsigned char       platform;               /* gxFontPlatform */
  unsigned char       script;                 /* gxFontScript */
  unsigned char       language;               /* gxFontLanguage */
  short               length;                 /* byte length of the name that follows */
  unsigned short      glyphCount;             /* CountFontGlyphs or 0 if gxFontGlyphsFlatten is false */
  unsigned short      axisCount;              /* CountFontVariations or 0 if gxFontVariationsFlatten is false */
  unsigned short      variationCount;         /* number of bitsVariationPairs that follow the (optional) glyphBits */
};
typedef struct gxFlatFontListItem       gxFlatFontListItem;
struct gxFlatFontList {
  long                count;
  gxFlatFontListItem  items[1];
};
typedef struct gxFlatFontList           gxFlatFontList;
struct gxFlattenHeader {
  Fixed               version;
  unsigned char       flatFlags;
  SInt8               padding;
};
typedef struct gxFlattenHeader          gxFlattenHeader;
enum {
  gxOmitPictureShapeMask        = 0xC0,
  gxOmitOverrideStyleMask       = 0x30,
  gxOmitOverrideInkMask         = 0x0C,
  gxOmitOverrideTransformMask   = 0x03
};

enum {
  gxOmitPictureShapeShift       = 0x06,
  gxOmitOverrideStyleShift      = 0x04,
  gxOmitOverrideInkShift        = 0x02,
  gxOmitOverrideTransformShift  = 0x00
};

enum {
  gxPostScriptTag               = FOUR_CHAR_CODE('post'),
  gxPostControlTag              = FOUR_CHAR_CODE('psct')
};

enum {
  gxNoSave                      = 1,    /* don't do save-restore around PS data */
  gxPSContinueNext              = 2     /* next shape is continuation of this shape's PS -- only obeyed if gxNoSave is true */
};

struct gxPostControl {
  long                flags;                  /* PostScript state flags */
};
typedef struct gxPostControl            gxPostControl;
enum {
  gxDashSynonymTag              = FOUR_CHAR_CODE('sdsh')
};

struct gxDashSynonym {
  long                size;                   /* number of elements in array */
  Fixed               dashLength[1];          /* Array of dash lengths */
};
typedef struct gxDashSynonym            gxDashSynonym;
enum {
  gxLineCapSynonymTag           = FOUR_CHAR_CODE('lcap')
};

enum {
  gxButtCap                     = 0,
  gxRoundCap                    = 1,
  gxSquareCap                   = 2,
  gxTriangleCap                 = 3
};

/* gxLine cap type */

typedef long                            gxLineCapSynonym;
enum {
  gxCubicSynonymTag             = FOUR_CHAR_CODE('cubx')
};

enum {
  gxIgnoreFlag                  = 0x0000, /* Ignore this word, get next one */
  gxLineToFlag                  = 0x0001, /* Draw a gxLine to gxPoint following this flag */
  gxCurveToFlag                 = 0x0002, /* Draw a gxCurve through the 3 points following this flag */
  gxMoveToFlag                  = 0x0003, /* Start a new contour at the gxPoint following this flag */
  gxClosePathFlag               = 0x0004 /* Close the contour */
};

typedef long                            gxCubicSynonym;
enum {
  gxCubicInstructionMask        = 0x000F /* low four bits are gxPoint instructions */
};

/* Low four bits are instruction (moveto, lineto, curveto, closepath) */
typedef short                           gxCubicSynonymFlags;
enum {
  gxPatternSynonymTag           = FOUR_CHAR_CODE('ptrn')
};

enum {
  gxHatch                       = 0,
  gxCrossHatch                  = 1
};

struct gxPatternSynonym {
  long                patternType;            /* one of the gxPatterns: gxHatch or gxCrossHatch */
  Fixed               angle;                  /* angle at which pattern is drawn */
  Fixed               spacing;                /* distance between two parallel pattern lines */
  Fixed               thickness;              /* thickness of the pattern */
  gxPoint             anchorPoint;            /* gxPoint with with respect to which pattern position is calculated */
};
typedef struct gxPatternSynonym         gxPatternSynonym;
enum {
  gxURLTag                      = FOUR_CHAR_CODE('urlt')
};


#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __GXTYPES__ */

